﻿#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
int main()
{
	int a = 10;

	int* pa = &a;
	char* pc = (char*) & a;
	printf("pa   = %p\n", pa);
 	printf("pa+1 = %p\n", pa + 1);
	printf("pc   = %p\n", pc);
	printf("pc+1 = %p\n", pc + 1);
	return 0; 
}


int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = (char*)& a;
	void* pv = &a;
	//*pv    pv+1  解引用和＋-是不可以的对于void来说
	return 0;
	  
}
int main()
{
	const int n  = 10;//const 是常属性 不能被修改
	// const 修饰了n之后，n 不能被修改了，但是n还是变量
	// n 是常变量
	n = 0;//err
	printf("%d\n", n);
	return 0;


}

int maion()
{
	int arr[10] = { 0 };
	const int n = 10;//被修饰后n依然是变量   // c++中const修饰的n 就是常量
	int  arr[n] = { 0 };//在数组内应该是常量不是变量
	return 0;
}

int main()
{
	const int n = 10;
	int* p = &n;
	*p = 20;
	printf("%d\n", n);
	return 0;
}







consat 修饰指针变量的两种情况
1.const 放在*的左边，意思是不能通过p来改变p指向的对象的内容，但是p本身是可以改变的，p可以指向其他对象
const int* p = &n;
2.conmst 放在*右边,限制的是p，意思是不能改p本身的值，但是p指向的内容是可以通过p来改变的
 int *const p =&n;


int main()
{
	const int n = 10;
	int m = 100;
	const int* p  = &n;
	//*p = 20;//err
	 p = &m;//ok
	printf("%p\n", p);
	return 0;
}

int main()
{
	const int n = 10;
	int m = 100;
    int* const p = &n;
	*p = 20;//ok
	//p = &m;//err
	return 0;
}
void test4()
{
	int n = 10;
	int m = 20;
	int const* const p = &n;
	//*p = 20; //ok?  err
	//p = &m; //ok?   err
} 


int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int i = 0;

	int sz = sizeof(arr)/sizeof(arr[0]);
	int* p = &arr[0];
	for (i = 0; i < sz; i++)
	{
		printf("%d", *p); 
			p++;
	}
	return 0;
}

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(p + i));//p+i 这⾥就是指针+整数
	}
	return 0;
}





指针-指针，运算的前提是两个指针指向了同一块空间
int main()
{
	int arr[10] = { 0 };
	printf("%d\n", &arr[9] - &arr[0]);
	printf("%d\n", &arr[0] - &arr[9]);
	//指针-指针的绝对值是指针和指针之间的元素个数
	return 0;

}

int my_strlen(char* p)
{ 
	int count = 0;
	while (*p != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int len = my_strlen(arr);
	printf("%d\n",len);
	return 0;
}

int main()//error
{
	printf("测试即将开始准备好了吗\n");
	int a;
	scanf("%d", &a);
	while (1)
	{
		if (a == 0)
		{
			printf("NO\?\?\?\n");
			break;
		}
		else  if (a == 1)
		{
			printf(" come on!\n");
			break;
		}
		else
		{
			printf("重新输入\n");
			break;
		}
	}
	return 0;
}

int my_strlen(char* s)
{
	char* p = s;
	while (*p != '\0')
		p++;
	return p - s;
}
int main()
{
	char arr[] = "abcdef";
	//数组名其实是数组首元素的地址
	//arr ==&arr[0]
	printf("%c\n", arr[0]);
	int len = my_strlen(arr);
	printf("%d\n", len );
	return 0;
}
 
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = &arr[0];
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	while (p < arr + sz) //指针的⼤⼩⽐较
	{
		printf("%d ", *p);
		p++;
	}
	return 0;
}


int main()
{
	int a =0 ;
	int* p =&a;//局部变量指针未初始化，默认为随机值
	*p = 20;
	printf("%d\n", *p);
	printf("%d\n", a);
	return 0;
}
int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i <= 11; i++)
	{
		当指针指向的范围超出数组arr的范围时，p就是野指针
		*(p++) = i;
	}
	return 0;
}

int* test()
{
	int n = 100;
	return &n;
}
int main()
{
	int* p = test();
	printf("%d\n", *p);
	return 0;
}